package model;

import java.util.ArrayList;
import java.util.List;

import model.alumnos.Alumno;
import model.alumnos.AlumnoEnCarrera;
import model.areas.Area;
import model.carrerasYPlanes.Carrera;
import model.carrerasYPlanes.PlanDeEstudio;
import model.interfaces.AlumnoIMPL;
import model.interfaces.CatedraIMPL;
import model.interfaces.MateriaIMPL;
import model.interfaces.UniversidadIMPL;
import model.materiasYCatedras.Catedra;
import model.materiasYCatedras.DiaYhorario;
import model.materiasYCatedras.Docente;
import model.materiasYCatedras.Materia;
import model.materiasYCatedras.MateriaPorPlanDeEstudio;
import model.materiasYCatedras.Persona;
import model.oficinaDeAlumnos.OficinaDeAlumnos;

public class Universidad implements UniversidadIMPL{
	
	private static Universidad instancia;
	private List<AlumnoIMPL> alumnos;
	private List<MateriaIMPL> materias;
	private List<Area> areas;
	
	private Universidad(){
		super();
		this.alumnos = new ArrayList<AlumnoIMPL>();
		this.materias = new ArrayList<MateriaIMPL>();
		this.areas = new ArrayList<Area>();
	}
	
	public static Universidad getInstance(){
		if(instancia == null){
			instancia = new Universidad();
			cargarDatosIniciales();
		}
		return instancia;
	}
	
	public void agregarAlumno(Alumno alumno){
		this.alumnos.add((AlumnoIMPL) alumno);
	}
	
	public void agregarMateria(MateriaPorPlanDeEstudio materia){
		this.materias.add((MateriaIMPL) materia);
	}
	
	public void agregarArea(Area area){
		this.areas.add(area);
	}
	
	public List<Area> getAreas(){
		return this.areas;
	}

	@Override
	public List<AlumnoIMPL> getAlumnos() {
		// TODO Auto-generated method stub
		return this.alumnos;
	}

	@Override
	public List<MateriaIMPL> getMaterias() {
		// TODO Auto-generated method stub
		return this.materias;
	}
	
	@Override
	public List<MateriaIMPL> materiasInscribibles(AlumnoIMPL alumno) {
		List<MateriaIMPL> materiasInscribibles = new ArrayList<MateriaIMPL>(); 
		for (MateriaIMPL unaMateria : this.getMaterias()){
			Alumno alu = (Alumno) alumno;
			for (AlumnoEnCarrera aluCarr : alu.getAlumnoEnCarrera()) {
				MateriaPorPlanDeEstudio mat = (MateriaPorPlanDeEstudio) unaMateria;
				if(OficinaDeAlumnos.getInstance().puedeInscribirseAlumnoEnMateria(mat, aluCarr)){
					materiasInscribibles.add(mat);
				}
			}
		}
		return materiasInscribibles;
	}

	@Override
	public void inscribirAlumno(AlumnoIMPL alumno, CatedraIMPL catedra) {
		Alumno alu = (Alumno) alumno;
		Catedra cat = (Catedra) catedra;
		AlumnoEnCarrera aluCarr = alu.getAlumnoCarrera(cat.getCarrera());
		OficinaDeAlumnos.getInstance().inscribirAlumnoEnCatedra(cat, aluCarr);
	}
	
	protected static void cargarDatosIniciales(){
		//Alumnos
		Alumno alu1 = new Alumno(new Persona("pepe", "lopez"));
		Alumno alu2 = new Alumno(new Persona("lea", "capo"));
		Alumno alu3 = new Alumno(new Persona("alumno", "apellido"));

		//Carreras
		Carrera carr1 = new Carrera("carrera1");
		Carrera carr2 = new Carrera("carrera1");
		Carrera carr3 = new Carrera("carrera1");
		
		//Materias
		Materia mat1 = new Materia("matematicas1");
		Materia mat2 = new Materia("intro");
		Materia mat3 = new Materia("objetos");
		
		//Plan de estudios
		PlanDeEstudio plan1 = new PlanDeEstudio("plan 2010", carr1);
		PlanDeEstudio plan2 = new PlanDeEstudio("plan 2011", carr2);
		PlanDeEstudio plan3 = new PlanDeEstudio("plan 2012", carr3);
		
		//Areas
		Area area1 = new Area("area 1");
		Area area2 = new Area("area 2");
		
		//Docentes
		Docente docente1 = new Docente(new Persona("a", "b"), area1); 
		Docente docente2 = new Docente(new Persona("a", "b"), area1); 
		
		//MateriasPorPlan
		MateriaPorPlanDeEstudio matPlan1 = new MateriaPorPlanDeEstudio(mat1, plan1);
		matPlan1.setHorasSemanales(4);
		matPlan1.setDificultad(5);
		matPlan1.setDocenteTitular(docente1);
		MateriaPorPlanDeEstudio matPlan2 = new MateriaPorPlanDeEstudio(mat2, plan1);
		matPlan2.setHorasSemanales(4);
		matPlan2.setDificultad(5);
		matPlan2.setDocenteTitular(docente2);
		MateriaPorPlanDeEstudio matPlan3 = new MateriaPorPlanDeEstudio(mat3, plan1);
		matPlan3.setHorasSemanales(4);
		matPlan3.setDificultad(5);
		matPlan3.setDocenteTitular(docente2);
		
		//Catedras
		Catedra cat1 = new Catedra(matPlan1, "catedra1");
		cat1.agregarHorario(new DiaYhorario("jueves", "12:00", "13:00"));
		Catedra cat2 = new Catedra(matPlan2, "catedra2");
		cat2.agregarHorario(new DiaYhorario("martes", "10:00", "11:00"));
		Catedra cat3 = new Catedra(matPlan3, "catedra3");
		cat3.agregarHorario(new DiaYhorario("jueves", "12:00", "19:00"));
		
		//Inscribo alumnos en carrera
		OficinaDeAlumnos.getInstance().inscribirAlumnoEnCarrera(alu1, carr1);
		OficinaDeAlumnos.getInstance().inscribirAlumnoEnCarrera(alu2, carr1);
		OficinaDeAlumnos.getInstance().inscribirAlumnoEnCarrera(alu3, carr1);
		
		//Inscribo alumnos en catedra
		OficinaDeAlumnos.getInstance().inscribirAlumnoEnCatedra(cat1, alu1.getAlumnoCarrera(carr1));
		OficinaDeAlumnos.getInstance().inscribirAlumnoEnCatedra(cat2, alu1.getAlumnoCarrera(carr1));
//		OficinaDeAlumnos.getInstance().inscribirAlumnoEnCatedra(cat3, alu1.getAlumnoCarrera(carr1));

		//agrego a alumnos materias cursadas
		alu1.getAlumnoCarrera(carr1).agregarMateriaCursada(matPlan1, 5.00);
		alu1.getAlumnoCarrera(carr1).agregarMateriaCursada(matPlan2, 8.00);
		alu1.getAlumnoCarrera(carr1).agregarMateriaCursada(matPlan3, 9.00);
		
//		System.out.println(alu1.getAlumnoEnCarrera().get(0).getMateriasAprobadas());
//		System.out.println(alu1.getAlumnoEnCarrera().get(0).promedio());
//		System.out.println(alu1.getAlumnoEnCarrera().get(0).getCreditosObtenidos());
//		System.out.println(alu1.getAlumnoEnCarrera().get(0).creditosFaltantes());
//		System.out.println(plan1.getCreditos());
	}

}
